#include <iostream>

#include "Parser.h"
using std::cout;
using std::endl;

#include <string>
using namespace std;
#include <fstream>
using std::ifstream;

#include <cstring>

const int MAX_TOKENS_POR_LINEA = 50;
const int MAX_CARACTERES_POR_LINEA = 512;
const char* const DELIMITER = " ";


int Parser::cargarArchivo(const char* directorio) {
	this->myfile.open(directorio);
	if (!this->myfile.good())
	    return 1; // exit if file not found
	else{
		this->directorio=directorio;
		return 0;
	}
}

Tupla Parser::cargarSiguienteLinea() {
	if(this->myfile.eof()){
		cout << "FIN DE ARCHIVO";
		return 0;
	}
	//Tupla tuplaResultante;
	int n = 0;
    const char* token[MAX_TOKENS_POR_LINEA] = {}; // initialize to 0
    char lineaAux[MAX_CARACTERES_POR_LINEA];
	if (this->myfile.is_open()){
		if (this->myfile.getline(this->linea,MAX_CARACTERES_POR_LINEA)){
			strcpy(lineaAux, this->linea);
		    token[0] = strtok(lineaAux, DELIMITER);}// first token
					if (token[0]) // zero if line is blank
			    {
			      for (n = 1; n < MAX_TOKENS_POR_LINEA; n++)
			      {
			        token[n] = strtok(0, DELIMITER); // subsequent tokens
			        if (!token[n]) break; // no more tokens
			      }
			    }

    // process (print) the tokens
	Tupla tuplaResultante(n);
    for (int i = 0; i < n; i++){ // n = # of tokens
      {
    	  //test :cout << "Token[" << i << "] = " << token[i] << endl;
    	  tuplaResultante.tuplaDeTerminos[i]=(string)token[i];
    	 //test:  cout << "Tupla[" << i << "] = " << tuplaResultante->tuplaDeTerminos[i] << endl;
      }
      //std::string test[tuplaResultante->nroDeTerminos] = *tuplaResultante->tuplaDeTerminos;
  }
//    delete tuplaResultante;
   return tuplaResultante;
}
	else {cout << "No se pudo acceder al archivo";
		return 0;	}
}

void Parser::mostrarLinea(){
	cout << (this->linea)<<endl;
}

int Parser::cerrarArchivo(){
	this->myfile.close();
	//this->directorio='\0';
	return 0;
}

string Parser::lineaActual(){
	return this->linea;
}

bool Parser::archivoProcesado()
{

	if(this->myfile.eof()){
			//cout << "FIN DE ARCHIVO"<<endl;
			return true;
		}
	return false;
}

bool Parser::existeArchivo(std::string ruta)
{
/*FILE* f = NULL;
	f = fopen((char *)&ruta,"r");
	if (f == NULL )
		return false;
	else {
		fclose(f);
		return true;
	}*/
	std::ofstream fs(ruta.c_str(),std::ios_base::in);
	if(fs.is_open())
	{
		fs.close();
		return true;
	}
	else
	{
		return false;
	}
}

void Parser::eliminarArchivo()
{
	if (this->myfile.is_open())
	{
		this->cerrarArchivo();
	}

	remove(this->directorio.c_str());
	//perror("");

}
